﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using BLL.DataContextClasses;

namespace BLL.BusinessClasses
{
    public class UsuarioEstudiante : BLL.BusinessClasses.UsuarioUniversitario
    {
        #region // Campos
        private bool siActivo;
        private Carrera carrera;        
        #endregion

        #region // Propiedades
        public bool SiActivo 
        {
            get { return this.siActivo; }
        }
        public Carrera Carrera
        {
            get
            {
                if (this.carrera == null)
                {
                    this.carrera = Carrera.GetCarreraByUsuarioEstudianteID(this.ID);
                }
                return this.carrera;
            }
            set { this.carrera = value; }
        }
        public override List<Aplicacion> Aplicaciones
        {
            get
            {
                if (this.aplicaciones == null)
                {
                    this.aplicaciones = Aplicacion.GetAplicacionesByEstudianteID(this.ID);
                }
                return this.aplicaciones;
            }
            set { this.aplicaciones = value; }
        }
        public override List<Contacto> Contactos
        {
            get
            {
                if (this.contactos == null)
                {
                    this.contactos = Contacto.GetContactosByEstudianteID(this.ID);
                }
                return this.contactos;
            }
            set { this.contactos = value; }
        }
        public override List<Habilidad> Habilidades
        {
            get
            {
                if (this.habilidades == null)
                {
                    this.habilidades = Habilidad.GetHabilidadesByEstudianteID(this.ID);
                }
                return this.habilidades;
            }
            set { this.habilidades = value; }
        }
        #endregion

        #region // Constructores
        public UsuarioEstudiante(int IDToSearch)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Estudiante Est = (from e in DB.Estudiantes
                                                     where (e.ID == IDToSearch)
                                                     select e).First();

                this.id = Est.ID;
                this.userName = Est.Matricula + Est.FechaNacimiento.Year.ToString();
                this.passWord = Est.PassWord;
                this.matricula = Est.Matricula;
                this.estado = Est.Estado;
                this.primerNombre = Est.PrimerNombre;
                this.segundoNombre = Est.SegundoNombre;
                this.primerApellido = Est.PrimerApellido;
                this.segundoApellido = Est.SegundoApellido;
                //this.carrera = Est.Carrera.Carrera.Descripcion;
                this.fechaNacimiento = Est.FechaNacimiento;
                this.edad = ((DateTime.Now.Subtract(Est.FechaNacimiento).Days) / 365);
                this.fechaPrimerIngreso = Est.FechaPrimerIngreso;
                this.fechaUltimoIngreso = Est.FechaUltimoIngreso;
                this.sexo = Est.Sexo.ToString();
                this.experienciaLaboral = Est.ExperienciaLaboral;
                this.detalleExperienciaLaboral = Est.DetalleExperienciaLaboral;
                this.intereses = Est.Intereses;
                this.siVehiculoPropio = Est.SiVehiculoPropio;
                this.siBuscaTiempoCompleto = Est.SiBuscaTiempoCompleto;
                this.foto = Est.Foto;
                this.siActivo = Est.Activo;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario\n" + SqlEx.Message);
            }
        }
        public UsuarioEstudiante(string UserNameToLog, string PassWordToLog)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Estudiante Est = (from e in DB.Estudiantes
                                                     where (e.Matricula + e.FechaNacimiento.Year.ToString() == UserNameToLog) && (e.PassWord == PassWordToLog)
                                                     select e).First();

                this.id = Est.ID;
                this.userName = Est.Matricula + Est.FechaNacimiento.Year.ToString();
                this.passWord = Est.PassWord;
                this.matricula = Est.Matricula;
                this.estado = Est.Estado;
                this.primerNombre = Est.PrimerNombre;
                this.segundoNombre = Est.SegundoNombre;
                this.primerApellido = Est.PrimerApellido;
                this.segundoApellido = Est.SegundoApellido;
                //this.carrera = Est.Carrera.Descripcion;
                this.fechaNacimiento = Est.FechaNacimiento;
                this.edad = ((DateTime.Now.Subtract(Est.FechaNacimiento).Days) / 365);
                this.fechaPrimerIngreso = Est.FechaPrimerIngreso;
                this.fechaUltimoIngreso = Est.FechaUltimoIngreso;
                this.sexo = Est.Sexo.ToString();
                this.experienciaLaboral = Est.ExperienciaLaboral;
                this.detalleExperienciaLaboral = Est.DetalleExperienciaLaboral;
                this.intereses = Est.Intereses;
                this.siVehiculoPropio = Est.SiVehiculoPropio;
                this.siBuscaTiempoCompleto = Est.SiBuscaTiempoCompleto;
                this.foto = Est.Foto;
                this.siActivo = Est.Activo;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario o su username o password estan mal escritos\n" + SqlEx.Message);
            }
        } 
        #endregion

        #region // Metodos
        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            try
            {
                DataContextClasses.Estudiante UsuarioEstToInsert = new DataContextClasses.Estudiante();

                UsuarioEstToInsert.ID = this.id;
                //UsuarioEgrToInsert.Matricula = this.userName;
                UsuarioEstToInsert.PassWord = this.passWord;
                UsuarioEstToInsert.Matricula = this.matricula;
                UsuarioEstToInsert.Estado = this.estado;
                UsuarioEstToInsert.PrimerNombre = this.primerNombre;
                UsuarioEstToInsert.SegundoNombre = this.segundoNombre;
                UsuarioEstToInsert.PrimerApellido = this.primerApellido;
                UsuarioEstToInsert.SegundoApellido = this.segundoApellido;
                UsuarioEstToInsert.ID_Carrera = this.Carrera.ID;
                //UsuarioEgrToInsert.ID_Carrera = Carrera.GetCarreraByUsuarioEgresadoID(this.id).ID;
                UsuarioEstToInsert.FechaNacimiento = this.fechaNacimiento;
                UsuarioEstToInsert.Sexo = this.sexo[0];
                UsuarioEstToInsert.ExperienciaLaboral = this.experienciaLaboral;
                UsuarioEstToInsert.DetalleExperienciaLaboral = this.detalleExperienciaLaboral;
                UsuarioEstToInsert.Intereses = this.intereses;
                UsuarioEstToInsert.SiVehiculoPropio = this.siVehiculoPropio;
                UsuarioEstToInsert.SiBuscaTiempoCompleto = this.siBuscaTiempoCompleto;
                UsuarioEstToInsert.Foto = this.foto;
                UsuarioEstToInsert.Activo = this.siActivo;

                DB.Estudiantes.InsertOnSubmit(UsuarioEstToInsert);

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la base de datos\n" + SqlEx.Message);
            }
        }
        public override void Actualizar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.Estudiante UsuarioEst = (from e in DB.Estudiantes
                                                            where e.ID == this.id
                                                            select e).First();

                UsuarioEst.ID = this.id;
                //UsuarioEgr.Matricula = this.userName;
                UsuarioEst.PassWord = this.passWord;
                UsuarioEst.Matricula = this.matricula;
                UsuarioEst.Estado = this.estado;
                UsuarioEst.PrimerNombre = this.primerNombre;
                UsuarioEst.SegundoNombre = this.segundoNombre;
                UsuarioEst.PrimerApellido = this.primerApellido;
                UsuarioEst.SegundoNombre = this.segundoNombre;
                UsuarioEst.ID_Carrera = this.Carrera.ID;
                UsuarioEst.FechaPrimerIngreso = this.fechaPrimerIngreso;
                UsuarioEst.FechaUltimoIngreso = this.fechaUltimoIngreso;
                UsuarioEst.Sexo = this.sexo[0];
                UsuarioEst.ExperienciaLaboral = this.experienciaLaboral;
                UsuarioEst.DetalleExperienciaLaboral = this.detalleExperienciaLaboral;
                UsuarioEst.Intereses = this.intereses;
                UsuarioEst.SiVehiculoPropio = this.siVehiculoPropio;
                UsuarioEst.SiBuscaTiempoCompleto = this.siBuscaTiempoCompleto;
                UsuarioEst.Foto = this.foto;
                UsuarioEst.Activo = this.siActivo;

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la base de datos\n" + SqlEx.Message);
            }
        }

        #region Metodos de La clase Base

        //public void AplicarAVacante(int VacanteID, string ComentarioDeAplicacion)
        //{
        //    try
        //    {
        //        Aplicacion AplicacionToSubmit = new Aplicacion(VacanteID, this, ComentarioDeAplicacion);
        //        AplicacionToSubmit.Insertar();

        //        this.aplicaciones = null;
        //    }
        //    catch (Exception Ex)
        //    {
        //        throw new Exception("Esta aplicacion ya existe\n" + Ex.Message);
        //    }
        //}
        //public void DesactivarAplicacion(int AplicacionID)
        //{
        //    try
        //    {
        //        Aplicacion AplicacionToDeactivate = (from atd in this.Aplicaciones
        //                                             where atd.ID == AplicacionID
        //                                             select atd).First();

        //        AplicacionToDeactivate.ToggleActivation();
        //    }
        //    catch (SqlException SqlEx)
        //    {
        //        throw new Exception("No existe tal aplicacion\n" + SqlEx.Message);
        //    }
        //}
        //public void ActivarAplicacion(int AplicacionID)
        //{
        //    try
        //    {
        //        Aplicacion AplicacionToActivate = (from atd in this.Aplicaciones
        //                                           where atd.ID == AplicacionID
        //                                           select atd).First();

        //        if (AplicacionToActivate.VacanteAplicada.SiActiva)
        //        {
        //            AplicacionToActivate.ToggleActivation();
        //            return;
        //        }
        //        else
        //        {
        //            throw new Exception("Esta aplicacion no se puede activar porque la vacante a la que estaba asociada ya no existe");
        //        }
        //    }
        //    catch (SqlException SqlEx)
        //    {
        //        throw new Exception("No existe tal aplicacion\n" + SqlEx.Message);
        //    }
        //} 
        
        #endregion
        #region Metodos de la clase base

        //public void AgregarContacto(int TipoContactoID, string ContactoDescripcion)
        //{
        //    try
        //    {
        //        DataClassesDataContext DB = new DataClassesDataContext();
        //        DataContextClasses.Contacto ContactoToAdd = new DataContextClasses.Contacto();

        //        ContactoToAdd.ID_TipoContacto = TipoContactoID;
        //        ContactoToAdd.TipoUsuario = "Estudiante";
        //        ContactoToAdd.ID_Usuario = this.id;
        //        ContactoToAdd.Contacto1 = ContactoDescripcion;

        //        DB.Contactos.InsertOnSubmit(ContactoToAdd);
        //        DB.SubmitChanges();

        //        this.contactos = null;
        //    }
        //    catch (SqlException)
        //    {
        //        throw new Exception("Este contacto no se puede agregar, ya existe en la base de datos");
        //    }
        //}
        //public void AgregarContacto(string TipoContactoDescripcion, string ContactoDescripcion)
        //{
        //    try
        //    {
        //        DataClassesDataContext DB = new DataClassesDataContext();
        //        DataContextClasses.Contacto ContactoToAdd = new DataContextClasses.Contacto();

        //        ContactoToAdd.ID_TipoContacto = (from tc in DB.TiposContactos
        //                                         where tc.Descripcion == TipoContactoDescripcion
        //                                         select tc).First().ID;

        //        ContactoToAdd.TipoUsuario = "Estudiante";
        //        ContactoToAdd.ID_Usuario = this.id;
        //        ContactoToAdd.Contacto1 = ContactoDescripcion;

        //        DB.Contactos.InsertOnSubmit(ContactoToAdd);
        //        DB.SubmitChanges();

        //        this.contactos = null;
        //    }
        //    catch (SqlException)
        //    {
        //        throw new Exception("Este contacto no se puede agregar, puede que ya exista en la base de datos");
        //    }
        //}
        //public void ModificarContacto(int ContactoID, string ContactoDescripcion)
        //{
        //    try
        //    {
        //        DataClassesDataContext DB = new DataClassesDataContext();

        //        DataContextClasses.Contacto ContactoToUpdate = (from ctu in DB.Contactos
        //                                                        where ctu.ID == ContactoID
        //                                                        select ctu).First();

        //        ContactoToUpdate.Contacto1 = ContactoDescripcion;

        //        DB.SubmitChanges();

        //        this.contactos = null;
        //    }
        //    catch (SqlException)
        //    {
        //        throw new Exception("Hubo un problema con la base de datos");
        //    }

        //}
        //public void EliminarContacto(int ContactoID)
        //{
        //    try
        //    {
        //        DataClassesDataContext DB = new DataClassesDataContext();

        //        DataContextClasses.Contacto ContactoToDelete = (from c in DB.Contactos
        //                                                        where c.ID == ContactoID
        //                                                        select c).First();

        //        DB.Contactos.DeleteOnSubmit(ContactoToDelete);
        //        DB.SubmitChanges();

        //        this.contactos = null;
        //    }
        //    catch (SqlException SqlEx)
        //    {
        //        throw new Exception("Error en la base de datos. Intente en unos minutos" + SqlEx.Message);
        //    }
        //}

        //public void CambiarPassWord(string NewPassWord)
        //{
        //    this.passWord = NewPassWord;

        //    this.Actualizar();
        //} 

        #endregion

        public override void AgregarHabilidad(int HabilidadID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                Estudiantes_Habilidade HabilidadToAdd = new Estudiantes_Habilidade();

                HabilidadToAdd.ID_Habilidad = HabilidadID;
                HabilidadToAdd.ID_Estudiante = this.id;

                DB.Estudiantes_Habilidades.InsertOnSubmit(HabilidadToAdd);
                DB.SubmitChanges();

                this.habilidades = null;
            }
            catch (SqlException)
            {
                throw new Exception("Esta habilidad no se puede agregar, ya pertenece a este egresado");
            }
        }
        public override void EliminarHabilidad(int HabilidadID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                Estudiantes_Habilidade HabilidadToDelete = (from e_h in DB.Estudiantes_Habilidades
                                                            where e_h.ID_Habilidad == HabilidadID && e_h.ID_Estudiante == this.id
                                                            select e_h).First();

                DB.Estudiantes_Habilidades.DeleteOnSubmit(HabilidadToDelete);
                DB.SubmitChanges();

                this.habilidades = null;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Error en la base de datos. Intente en unos minutos" + SqlEx.Message);
            }
        }        

        public static UsuarioEstudiante GetEstudianteByID(int IDToSearch)
        {
            try
            {
                return new UsuarioEstudiante(IDToSearch);
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario\n" + SqlEx.Message);
            }
        }
        public static List<UsuarioEstudiante> GetEstudiantesByCarreraID(int CarreraID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                List<UsuarioEstudiante> ListEstudianteToReturn = new List<UsuarioEstudiante>();

                var QueryEstudiantes = from e in DB.Estudiantes
                                       where e.ID_Carrera == CarreraID
                                       select e.ID;

                foreach (int EstudianteID in QueryEstudiantes)
                {
                    ListEstudianteToReturn.Add(new UsuarioEstudiante(EstudianteID));
                }

                return ListEstudianteToReturn;
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + ex.Message);
            }
        }
        #endregion
    }
}
